#pragma once
#ifndef __G_TRANSFORM_2_H__
#define __G_TRANSFORM_2_H__

#include "GRay2.h"
#include "GCircle.h"
#include "GVector2.h"
#include "GMatrix3x3.h"
#include "GTriangle2.h"
#include "GRectangleAligned.h"
#include "GRectangleOriented.h"
#include "GCoordFrame2.h"

namespace GMath
{

	class GTransform2
	{
	public:
		static void		Transform(OUTPUT GRay2& Output, const GRay2& Ray, const GCoordFrame2& Frame);
		static void		Transform(OUTPUT GRay2& Output, const GRay2& Ray, const GVector2& Scale, float Rotation, const GVector2& Translation);

		static void		Transform(OUTPUT GCircle& Output, const GCircle& Disk, const GCoordFrame2& Frame);
		static void		Transform(OUTPUT GCircle& Output, const GCircle& Disk, const GVector2& Scale, float Rotation, const GVector2& Translation);

		static void		Transform(OUTPUT GTriangle2& Output, const GTriangle2& Triangle, const GCoordFrame2& Frame);
		static void		Transform(OUTPUT GTriangle2& Output, const GTriangle2& Triangle, const GVector2& Scale, float Rotation, const GVector2& Translation);

		static void		Transform(OUTPUT GRectangleAligned& Output, const GRectangleAligned& Rect, const GCoordFrame2& Frame);
		static void		Transform(OUTPUT GRectangleAligned& Output, const GRectangleAligned& Rect, const GVector2& Scale, float Rotation, const GVector2& Translation);

		static void		Transform(OUTPUT GRectangleOriented& Output, const GRectangleOriented& Rect, const GCoordFrame2& Frame);
		static void		Transform(OUTPUT GRectangleOriented& Output, const GRectangleOriented& Rect, const GVector2& Scale, float Rotation, const GVector2& Translation);

		static void		CreateScale(OUTPUT GMatrix3x3& Output, const GVector2& Scale);
		static void		CreateRotation(OUTPUT GMatrix3x3& Output, float Value);
		static void		CreateTranslation(OUTPUT GMatrix3x3& Output, const GVector2& Position);

		static void		CreateLocal(OUTPUT GMatrix3x3& Output, const GVector2& Scale, float Rotation, const GVector2 Position);

		static void		CreateShear(OUTPUT GMatrix3x3& Output, const GVector2& Shear);
		static void		CreateReflection(OUTPUT GMatrix3x3& Output, const GVector2& Axis);
	};

}

#endif